# coding=utf-8
# 开发时间：2023/12/29 10:30
from datetime import datetime, timedelta
from flask import current_app
import jwt
from jwt import PyJWTError

from common.models.user import User
from common.utils import const


def generate_tokens(uid):
    '''
    一个用户在一次会话中生成一个token
    :param uid:
    :return:
    '''
    params = {
        'id': uid,
        # exp  代表token的有效时间
        'exp': datetime.utcnow() + timedelta(seconds=const.JWT_EXPIRY_SECOND)
    }  # 限制时间，只能用exp,追进去之后发现，是规定好的。但是其他的参数是可以自己任意传进去的。
    # 参数2：秘钥，参数3：算法
    # SHA-256:密码散列函数算法。256bit长大的哈希值（32个数组）--->十六进制字符串来表示。64   信息摘要不可逆
    return jwt.encode(payload=params, key=const.SECRET_KEY, algorithm='HS256')  # 算法是：SHA-256


def verify_token(token_str):
    '''
    验证token,如果验证成功，返回用户ID
    :param token_str:
    :return:
    '''
    try:
        data = jwt.decode(token_str, key=const.SECRET_KEY, algorithms='HS256')
        current_app.logger.info(data)
        user = User.query.filter(User.id == data['id']).first()
        if user and user.onlock == 0:  # 0代表当前用户的状态正常
            return {'id': user.id}
        else:
            return {'message': '数据库中不存在当前用户，或者用户已经过期'}
    except PyJWTError as e:
        current_app.logger.error(e)
        return {'message': 'token验证失败'}
